{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "both",
        "colab": {},
        "colab_type": "code",
        "id": "qnMpW5Y9nv2l"
      },
      "outputs": [],
      "source": [
        "# Copyright 2020 Google LLC\n",
        "#\n",
        "# Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "# you may not use this file except in compliance with the License.\n",
        "# You may obtain a copy of the License at\n",
        "#\n",
        "#     https://www.apache.org/licenses/LICENSE-2.0\n",
        "#\n",
        "# Unless required by applicable law or agreed to in writing, software\n",
        "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "# See the License for the specific language governing permissions and\n",
        "# limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "mHF9VCProKJN"
      },
      "source": [
        "# TabNet: Attentive Interpretable Tabular Learning\n",
        "\n",
        "<table align=\"left\">\n",
        "  <td>\n",
        "    <a href=\"https://colab.research.google.com/github/GoogleCloudPlatform/ml-on-gcp/blob/master/tutorials/explanations/ai-explanations-tabnet-algorithm.ipynb\">\n",
        "      <img src=\"https://cloud.google.com/ml-engine/images/colab-logo-32px.png\" alt=\"Colab logo\"> Run in Colab\n",
        "    </a>\n",
        "  </td>\n",
        "  <td>\n",
        "    <a href=\"https://github.com/GoogleCloudPlatform/ml-on-gcp/tree/master/tutorials/explanations/ai-explanations-tabnet-algorithm.ipynb\">\n",
        "      <img src=\"https://cloud.google.com/ml-engine/images/github-logo-32px.png\" alt=\"GitHub logo\">\n",
        "      View on GitHub\n",
        "    </a>\n",
        "  </td>\n",
        "</table>"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "hZzRVxNtH-zG"
      },
      "source": [
        "## Overview\n",
        "\n",
        "AI Platform provides a built-in algorithm based on [TabNet](https://arxiv.org/abs/1908.07442).\n",
        "\n",
        "Learn how to [train and deploy a model with the TabNet built-in algorithm](https://cloud.google.com/ai-platform/training/docs/algorithms/tab-net-start).\n",
        "\n",
        "This tutorial provides the sample code to visualize the explanation of TabNet algorithm with Synthetic_2 (Syn2) data.\n",
        "\n",
        "Syn2 data is described at [Section 4.1 of learning to explain paper](https://arxiv.org/pdf/1802.07814.pdf). The input feature X is generated from a 10-dimensional standard Gaussian. The response variable Y is generated from feature X[3:6] only."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "Su2qu-4CW-YH"
      },
      "source": [
        "### Objective\n",
        "\n",
        "The goal is to provide a sample plotting tool to visualize the output of TabNet, which is helpful in explaining the algorithm."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "rgLXkyHEvTVD"
      },
      "source": [
        "## Before you begin\n",
        "\n",
        "Make sure you're running this notebook in a **GPU runtime** if you have that option. In Colab, select **Runtime** --> **Change runtime type**\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "avDUUQEGTnUo"
      },
      "source": [
        "This tutorial assumes you are running the notebook either in **Colab** or **Cloud AI Platform Notebooks**."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "i2qsxysTVc-l"
      },
      "source": [
        "### Set up your GCP project\n",
        "\n",
        "**The following steps are required, regardless of your notebook environment.**\n",
        "\n",
        "1. [Select or create a GCP project.](https://console.cloud.google.com/cloud-resource-manager)\n",
        "\n",
        "2. [Make sure that billing is enabled for your project.](https://cloud.google.com/billing/docs/how-to/modify-project)\n",
        "\n",
        "3. [Enable the AI Platform Training & Prediction and Compute Engine APIs.](https://console.cloud.google.com/flows/enableapi?apiid=ml.googleapis.com,compute_component)\n",
        "\n",
        "4. Enter your project ID in the cell below. Then run the  cell to make sure the\n",
        "Cloud SDK uses the right project for all the commands in this notebook.\n",
        "\n",
        "**Note**: Jupyter runs lines prefixed with `!` as shell commands, and it interpolates Python variables prefixed with `$` into these commands."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "both",
        "colab": {},
        "colab_type": "code",
        "id": "4qxwBA4RM9Lu"
      },
      "outputs": [],
      "source": [
        "PROJECT_ID = \"[<your-project-id>]\""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "TSy-f05IO4LB"
      },
      "source": [
        "### Authenticate your GCP account\n",
        "\n",
        "**If you are using AI Platform Notebooks**, your environment is already\n",
        "authenticated. Skip this step."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "fZQUrHdXNJnk"
      },
      "source": [
        "**If you are using Colab**, run the cell below and follow the instructions\n",
        "when prompted to authenticate your account via oAuth."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "W9i6oektpgld"
      },
      "outputs": [],
      "source": [
        "import os\n",
        "import sys\n",
        "import warnings\n",
        "\n",
        "warnings.filterwarnings('ignore')\n",
        "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'\n",
        "# If you are running this notebook in Colab, follow the\n",
        "# instructions to authenticate your GCP account. This provides access to your\n",
        "# Cloud Storage bucket and lets you submit training jobs and prediction\n",
        "# requests.\n",
        "\n",
        "\n",
        "def install_dlvm_packages():\n",
        "    !pip install tabulate\n",
        "\n",
        "\n",
        "if 'google.colab' in sys.modules:\n",
        "    from google.colab import auth as google_auth\n",
        "    google_auth.authenticate_user()\n",
        "    !pip install witwidget --quiet\n",
        "    !pip install tensorflow==1.15.0 --quiet\n",
        "    !gcloud config set project $PROJECT_ID\n",
        "\n",
        "\n",
        "elif \"DL_PATH\" in os.environ:\n",
        "    install_dlvm_packages()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "tT061irlJwkg"
      },
      "source": [
        "### Create a Cloud Storage bucket\n",
        "\n",
        "**The following steps are required, regardless of your notebook environment.**\n",
        "\n",
        "When you submit a training job using the Cloud SDK, you upload a Python package\n",
        "containing your training code to a Cloud Storage bucket. AI Platform runs\n",
        "the code from this package. In this tutorial, AI Platform also saves the\n",
        "trained model that results from your job in the same bucket. You can then\n",
        "create an AI Platform model version based on this output in order to serve\n",
        "online predictions.\n",
        "\n",
        "Set the name of your Cloud Storage bucket below. It must be unique across all\n",
        "Cloud Storage buckets. \n",
        "\n",
        "You may also change the `REGION` variable, which is used for operations\n",
        "throughout the rest of this notebook. Make sure to [choose a region where Cloud\n",
        "AI Platform services are\n",
        "available](https://cloud.google.com/ml-engine/docs/tensorflow/regions). You may\n",
        "not use a Multi-Regional Storage bucket for training with AI Platform."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "bTxmbDg1I0x1"
      },
      "outputs": [],
      "source": [
        "BUCKET_NAME = \"[<your-bucket-name>]\"\n",
        "REGION = \"us-central1\""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "fsmCk2dwJnLZ"
      },
      "source": [
        "**Only if your bucket doesn't already exist**: Run the following cell to create your Cloud Storage bucket."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "160PRO3aJqLD"
      },
      "outputs": [],
      "source": [
        "!gsutil mb -l $REGION gs://$BUCKET_NAME"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "PyxoF-iqqD1t"
      },
      "source": [
        "### Import libraries\n",
        "\n",
        "Import the libraries we'll be using in this tutorial. "
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "MEDlLSWK15UL"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import json\n",
        "from google.cloud import storage\n",
        "import matplotlib.pyplot as plt\n",
        "import matplotlib.cm as cm\n",
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "aRVMEU2Qshm4"
      },
      "source": [
        "## Reading a sample TabNet prediction on syn2 data\n",
        "\n",
        "After training and serving your model, you upload the output to Google Cloud Storage. There is a sample TabNet prediction using synthetic data: gs://cloud-samples-data/ai-platform/synthetic/tab_net_output/syn2\n",
        "\n",
        "You can copy this output to your bucket for testing. Running prediction on your own data will generate the output having the same format.\n",
        "\n",
        "Each prediction in TabNet contains **aggregated_mask_values** field. The masks are used to explain the predictions. \n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "v7HLNsvekxvz"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Copying gs://cloud-samples-data/ai-platform/synthetic/tab_net_output/syn2 [Content-Type=text/plain]...\n",
            "/ [1 files][  2.2 MiB/  2.2 MiB]                                                \n",
            "Operation completed over 1 objects/2.2 MiB.                                      \n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "['feat_1',\n",
              " 'feat_2',\n",
              " 'feat_3',\n",
              " 'feat_4',\n",
              " 'feat_5',\n",
              " 'feat_6',\n",
              " 'feat_7',\n",
              " 'feat_8',\n",
              " 'feat_9',\n",
              " 'feat_10',\n",
              " 'feat_11']"
            ]
          },
          "execution_count": 3,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "!gsutil cp gs://cloud-samples-data/ai-platform/synthetic/tab_net_output/syn2 gs://$BUCKET_NAME\n",
        "\n",
        "# Replace your the BUCKET_NAME and PREDICTION_FILE\n",
        "# BUCKET_NAME = \"[<your-bucket-name>]\"\n",
        "# PREDICTION_FILE = \"[<your-prediction-file>]\"\n",
        "\n",
        "PREDICTION_FILE = \"syn2\"\n",
        "\n",
        "MASK_KEY = \"aggregated_mask_values\"\n",
        "\n",
        "HEADER = [(\"feat_\" + str(i)) for i in range(1, 12)]\n",
        "HEADER"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "8zr6lj66UlMn"
      },
      "source": [
        "### Download and preprocess the predictions."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "Icz22E69smnD"
      },
      "outputs": [
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "/usr/local/google/home/longtle/lib/python3.7/site-packages/google/auth/_default.py:69: UserWarning: Your application has authenticated using end user credentials from Google Cloud SDK. We recommend that most server applications use service accounts instead. If your application continues to use end user credentials from Cloud SDK, you might receive a \"quota exceeded\" or \"API not enabled\" error. For more information about service accounts, see https://cloud.google.com/docs/authentication/\n",
            "  warnings.warn(_CLOUD_SDK_CREDENTIALS_WARNING)\n",
            "/usr/local/google/home/longtle/lib/python3.7/site-packages/google/auth/_default.py:69: UserWarning: Your application has authenticated using end user credentials from Google Cloud SDK. We recommend that most server applications use service accounts instead. If your application continues to use end user credentials from Cloud SDK, you might receive a \"quota exceeded\" or \"API not enabled\" error. For more information about service accounts, see https://cloud.google.com/docs/authentication/\n",
            "  warnings.warn(_CLOUD_SDK_CREDENTIALS_WARNING)\n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "['{\"predicted_classes\": [0], \"logits\": [-1.6054713726043701], \"aggregated_mask_values\": [0.0, 0.0, 1.1298394203186035, 0.8574417233467102, 0.3952142894268036, 2.4348602294921875, 0.5338992476463318, 0.0, 0.0, 0.0, 0.0], \"key\": [\"2\"]}']"
            ]
          },
          "execution_count": 4,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "storage_client = storage.Client()\n",
        "bucket = storage_client.get_bucket(BUCKET_NAME)\n",
        "blob = bucket.blob(PREDICTION_FILE)\n",
        "f = blob.download_as_string(client=None).decode(\"utf-8\").strip()\n",
        "predictions = f.split(\"\\n\")\n",
        "predictions[:1]"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "iSrzwuchvcgv"
      },
      "source": [
        "### Parse the mask values in prediction. Then, concatenate the mask values.\n",
        "The output is a matrix having Nxk (N is the number of outputs, k is the size of each mask).\n",
        "Concatenating mask values are used to visualize the feature importance."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "D5PIljnYveDN"
      },
      "outputs": [
        {
          "data": {
            "text/plain": [
              "(10000, 11)"
            ]
          },
          "execution_count": 5,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "masks = []\n",
        "for prediction in predictions:\n",
        "    prediction = json.loads(prediction)\n",
        "    masks.append(prediction[MASK_KEY])\n",
        "masks = np.matrix(masks)\n",
        "masks.shape"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "kV_NEAQwwH0e"
      },
      "source": [
        "## Visualize the mask value matrix. \n",
        "The lighter color indicates more important feature.\n",
        "For example, only features 3-6 are meaningful in prediction output in Syn2 data. In the plot, the column 3-6 have light color."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "colab": {},
        "colab_type": "code",
        "id": "3kQz8Q0DsBM7"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<Figure size 1440x720 with 1 Axes>"
            ]
          },
          "metadata": {
            "needs_background": "light"
          },
          "output_type": "display_data"
        }
      ],
      "source": [
        "fig = plt.figure(figsize=(20, 10))\n",
        "ax = fig.add_subplot(121)\n",
        "ax.imshow(masks[:50, :], interpolation='bilinear', cmap=cm.Greys_r)\n",
        "ax.set_xlabel('Features')\n",
        "ax.set_ylabel('Sample index')\n",
        "ax.xaxis.set_ticks(np.arange(len(HEADER)))\n",
        "ax.set_xticklabels(HEADER, rotation='vertical')\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "3F2g4OjbJ3gZ"
      },
      "source": [
        "If your Cloud Storage bucket doesn't contain any other objects and you would like to delete it, run `gsutil rm -r gs://$BUCKET_NAME`."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "colab_type": "text",
        "id": "K0UXLWaBJnrY"
      },
      "source": [
        "## What's next?\n",
        "\n",
        "To learn more about TabNet, check out the resources here.\n",
        "\n",
        "* [TabNet: Attentive Interpretable Tabular Learning](https://arxiv.org/abs/1908.07442)\n",
        "* [https://arxiv.org/abs/1908.07442](https://cloud.google.com/ai-platform/training/docs/algorithms?hl=en) "
      ]
    }
  ],
  "metadata": {
    "colab": {
      "collapsed_sections": [],
      "name": "ai-explanations-tabnet-algorithm.ipynb",
      "provenance": [],
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
